/*
 * Tạo bảng hiển thị thông tin
 */
package view;

import javax.microedition.lcdui.*;

import fhedu.*;
import obj.*;
import java.util.Vector;
import javax.microedition.lcdui.game.GameCanvas;

/**
 * @author liemmaster
 */
public class frmTable extends GameCanvas implements CommandListener {

    public String sTitle; //Tiêu đề bảng
    public String sHead[]; //Tiêu đề cột
    public Vector oData; //Danh sách dữ liệu của bảng
    public int iCol; //Số cột
    public int iRowDataHeight; //Độ rộng của cột
    public int iColWidth[]; //Quy định độ rộng của cột, tính bằng phần trăm
    public int iRowFocus; //Hàng đang được chọn
    public int iColFocus; //Cột đang được chọn
    /**
     * constructor
     */
    public frmTable() {
        super(false);
        try 
        {
            iRowFocus = iColFocus = 0;
            // Set up this canvas to listen to command events
            setCommandListener(this);
            // Add the Exit command
            addCommand(new Command("Exit", Command.EXIT, 1));
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
    }
    
    public void DisplayFrm()
    {
        DrawTable();
        FocusCell(iRowFocus, iColFocus, Mau.maudo);
    }
    
    //Hàm vẽ bảng
    void DrawTable()
    {
        Graphics g = getGraphics();
//---Xác định kiểu dữ liệu truyền vào
        int iType = 0;
        if(oData.elementAt(0).getClass().getName().equals("obj.ObjLichHoc"))
        {
            iType = 1;//Lịch học
        }

        //Hiển thị tiêu đề bảng
        g.setFont(MyFont.fontto);
        g.setColor(Mau.mauXanhNuocBien);
        g.drawString(sTitle, getWidth()/2, 16, Graphics.BASELINE | Graphics.HCENTER);
        //Vẽ tiêu đề cột
        g.setColor(Mau.mauden);
        g.setFont(MyFont.fontNhoTieuDe);
        int iX;
        int iY = 20;
        int iWidth;
        iX = 0;
        for(int j=0;j<iCol;++j)
        {
            iWidth = (getWidth() * iColWidth[j]) / 100;
            Cell cellHead = new Cell(sHead[j], iWidth, 20, Mau.mautrang, Mau.mauden, Mau.mauXanhNuocBien);
            cellHead.canle = 1;
            cellHead.VeCell(g, iX, iY);
            iX += iWidth;
        }
        
        ObjLichHoc objLichhoc;
        g.setColor(Mau.mauden);
        g.setFont(MyFont.fontnho);
        iX = 0;
        iY = 40;
        int j = 0;
        Cell cellData = new Cell();
        switch(iType) //Xử lý vẽ bảng theo dữ liệu truyền vào
        {
            case 1:
                iRowFocus = 0;
                iColFocus = 4;
                for(int i=0;i<oData.size();++i)
                {
                    j = 0;
                    iX = 0;
                    objLichhoc = (ObjLichHoc) oData.elementAt(i);

                    //-----------------Each item
                    iWidth = (getWidth() * iColWidth[j]) / 100;
                    cellData.setAtt(objLichhoc.getsNgayhoc() + "\n" + objLichhoc.getsGiobatdau() + "-" + objLichhoc.getsGioketthuc(), iWidth, iRowDataHeight, Mau.mauden, Mau.mauden, Mau.mautrang);
                    cellData.canle = 0;
                    cellData.VeCell(g, iX, iY);
                    iX += iWidth;
                    //----------------
                    ++j;
                    //-----------------Each item
                    iWidth = (getWidth() * iColWidth[j]) / 100;
                    cellData.setAtt(objLichhoc.getsTenmonhoc(), iWidth, iRowDataHeight, Mau.mauden, Mau.mauden, Mau.mautrang);
                    cellData.canle = 0;
                    cellData.VeCell(g, iX, iY);
                    iX += iWidth;
                    //----------------
                    ++j;
                    //-----------------Each item
                    iWidth = (getWidth() * iColWidth[j]) / 100;
                    cellData.setAtt(objLichhoc.getsTenlop(), iWidth, iRowDataHeight, Mau.mauden, Mau.mauden, Mau.mautrang);
                    cellData.canle = 1;
                    cellData.VeCell(g, iX, iY);
                    iX += iWidth;
                    //----------------
                    ++j;
                    //-----------------Each item
                    iWidth = (getWidth() * iColWidth[j]) / 100;
                    cellData.setAtt(objLichhoc.getsTenphong(), iWidth, iRowDataHeight, Mau.mauden, Mau.mauden, Mau.mautrang);
                    cellData.canle = 1;
                    cellData.VeCell(g, iX, iY);
                    iX += iWidth;
                    //----------------
                    ++j;
                    //-----------------Each item
                    iWidth = (getWidth() * iColWidth[j]) / 100;
                    cellData.setAtt(objLichhoc.getsTrangthai(), iWidth, iRowDataHeight, Mau.mauden, Mau.mauden, Mau.mautrang);
                    cellData.canle = 1;
                    cellData.VeCell(g, iX, iY);
                    //----------------
                    iY += iRowDataHeight;
                }
                break;
        }
    }
    
    //Hàm tô màu ô đang được chọn
    void FocusCell(int iRow, int iCol, int cColor)
    {
        Graphics g = getGraphics();
        int iCellWidth = (getWidth() * iColWidth[iCol]) / 100;
        int iCellHeight = iRowDataHeight;
                
        g.setColor(cColor);
//        g.drawRect(getXCol(iCol), iCol * iCellHeight + 40, iCellWidth, iCellHeight);
        g.drawRect(getXCol(iCol)+1, iRow * iCellHeight + 41, iCellWidth-3, iCellHeight-3);
        
        //        int rgb[] = new int[iCellWidth*iCellHeight];
//        Image imgFocus;
//        imgFocus = Image.createImage(iCellWidth, iCellHeight);
//        Graphics gFocus = imgFocus.getGraphics();
//        gFocus.setColor(0x0000ff);
//        gFocus.fillRect(0, 0, iCellWidth, iCellHeight);
//        imgFocus.getRGB(rgb, 0, iCellWidth, 0, 0, iCellWidth, iCellHeight);
//        for(int i=0, n=rgb.length;i<n; ++i)
//        {
//            rgb[i]&=0x77ffffff;
//        }
//        g.drawRGB(rgb, 0, iCellWidth, getXCol(iCol), iCol * iCellHeight, iCellWidth, iCellHeight, true);
         flushGraphics();
    }
    
    void UnFocusCell(int iRow, int iCol)
    {
        FocusCell(iRow, iCol, Mau.mautrang);
        flushGraphics();
    }

    //Hàm lấy tọa độ mép trái theo chỉ số cột
    public int getXCol(int iColIndex)
    {
        int iRes = 0;
        for(int i=0; i<iColIndex; ++i)
        {
            iRes += (getWidth() * iColWidth[i]) / 100;
        }
        return iRes;
    }
    
    /**
     * Called when a key is pressed.
     */
    public void keyPressed(int keyCode) {
        switch(getGameAction(keyCode))
        {
            case UP:
                    if(iRowFocus > 0)
                    {
                        UnFocusCell(iRowFocus, iColFocus);
                        iRowFocus--;
                        FocusCell(iRowFocus, iColFocus, Mau.maudo);
                    }
                    
                break;
            case DOWN:
                    if(iRowFocus < oData.size()-1)
                    {
                        UnFocusCell(iRowFocus, iColFocus);
                        iRowFocus++;
                        FocusCell(iRowFocus, iColFocus, Mau.maudo);
                    } 
                break;
            case RIGHT:
                break;
            case LEFT:
                break;
            case FIRE:
                    Form frmCapNhatLichHoc = new Form("Cập nhật lịch học");
                    Command cmdThucThi = new Command("Thực thi", Command.OK, 0);
                    Command cmdQuayLai = new Command("Quay lại", Command.CANCEL, 0);
                    ChoiceGroup cgCapNhat;
                    ObjLichHoc lichFocus = (ObjLichHoc) oData.elementAt(iRowFocus);
                    cgCapNhat = new ChoiceGroup("Tác vụ: ", Choice.EXCLUSIVE);
                    cgCapNhat.append("Học", null);
                    cgCapNhat.append("Nghỉ", null);
                    
                    frmCapNhatLichHoc.append(lichFocus.toString());
                    frmCapNhatLichHoc.append(cgCapNhat);
                    frmCapNhatLichHoc.addCommand(cmdQuayLai);
                    frmCapNhatLichHoc.addCommand(cmdThucThi);
                    FHEDU.display.setCurrent(frmCapNhatLichHoc);
                break;                
        }
    }

    /**
     * Called when a key is released.
     */
    protected void keyReleased(int keyCode) {
    }

    /**
     * Called when a key is repeated (held down).
     */
    protected void keyRepeated(int keyCode) {
    }

    /**
     * Called when the pointer is dragged.
     */
    protected void pointerDragged(int x, int y) {
    }

    /**
     * Called when the pointer is pressed.
     */
    protected void pointerPressed(int x, int y) {
    }

    /**
     * Called when the pointer is released.
     */
    protected void pointerReleased(int x, int y) {
    }

    /**
     * Called when action should be handled
     */
    public void commandAction(Command command, Displayable displayable) {
    }
}
